#include "SilnikGraficzny.h"

SilnikGraficzny::SilnikGraficzny()
{
	init();
	pobierzDane();
}

void SilnikGraficzny::wyswietlKoniec(bool czyWygrana,Labirynt * labirynt)
{
	if(czyWygrana)
	{
		//jeśli gracz wygrał
		Mix_PlayMusic( dzwiekWygrana, 1 );
		komunikat="Gratulacje, wygrales!!!";
		rysujLabirynt(labirynt);
		sleep(5);
	}
	else
	{
		//jeśli gracz przegrał
		Mix_PlayMusic( dzwiekPrzegrana, 1 );
		komunikat="GAME OVER! Przeciwnik Wygral!";
		rysujLabirynt(labirynt);
		sleep(5);
	}
}

void SilnikGraficzny::wyswietlOdliczanie(Labirynt * labirynt)
{
	komunikat="3";
	rysujLabirynt(labirynt);
	sleep(1);
	komunikat="2";
	rysujLabirynt(labirynt);
	sleep(1);
	komunikat="1";
	rysujLabirynt(labirynt);
	sleep(1);
	komunikat="";
	rysujLabirynt(labirynt);
}
SDL_Surface * SilnikGraficzny::wczytajObraz(std::string filename)
{
	SDL_Surface* loadedImage=NULL;
	SDL_Surface* optimizedImage = NULL;
	loadedImage = IMG_Load(filename.c_str());
	if(loadedImage!=NULL)
	{
		optimizedImage= SDL_DisplayFormat(loadedImage);
		SDL_FreeSurface(loadedImage);
		if(optimizedImage != NULL)
		{
			Uint32 colorkey = SDL_MapRGB(optimizedImage->format,0,0xFF,0xFF);
			SDL_SetColorKey(optimizedImage,SDL_SRCCOLORKEY,colorkey);

		}
	}
	return optimizedImage;
}

void SilnikGraficzny::nalozObraz(int x,int y, SDL_Surface* source, SDL_Surface* destination)
{
	SDL_Rect offset;
	offset.x = x;
	offset.y = y;
	SDL_BlitSurface(source,NULL,destination,&offset);

}

bool SilnikGraficzny::init()
{
	// ogólna inicjalizacja SDL:
	if(SDL_Init( SDL_INIT_EVERYTHING ) == -1)
		return false;

	// czcionki:
	TTF_Init();
	font = TTF_OpenFont("Arial.ttf", 60);

	//wyłączanie kursora myszy
	SDL_ShowCursor(SDL_DISABLE);

	//Otwieranie strunmienia audio:
	Mix_OpenAudio( 22050, MIX_DEFAULT_FORMAT, 2, 4096 );
	//wybieranie trybu wyświetlania (rozdzielczość itp.)
	screen = SDL_SetVideoMode(SCREEN_WIDTH,SCREEN_HEIGHT,SCREEN_BPP,SDL_SWSURFACE | SDL_FULLSCREEN);
	if(screen==NULL)
		return false;


	return true;
}

void SilnikGraficzny::wyswietlNapis(int x, int y, std::string tresc)
{
	if(!tresc.empty())
	{
	SDL_Surface * tekst;
	SDL_Color kolor;
	kolor.r=240;
	kolor.g=240;
	kolor.b=255;
	tekst = TTF_RenderText_Solid(font,komunikat.c_str(), kolor);

	nalozObraz((SCREEN_WIDTH-tekst->w)/2,y,tekst,screen);
	}
}
bool SilnikGraficzny::pobierzDane()
{
	//Wczytywanie obrazów:
	//"kafelki" labiryntu:
	obrazLabiryntu[Labirynt::PUSTE] = wczytajObraz("images/korytarz.png");
	obrazLabiryntu[Labirynt::PRZESZKODA] = wczytajObraz("images/sciana.png");
	obrazLabiryntu[Labirynt::KONIEC] = wczytajObraz("images/koniec.png");
	//tekstura gracza pierwszego:
	gracz1[0] = wczytajObraz("images/gracz1_gora.png");
	SDL_SetColorKey( gracz1[0], SDL_SRCCOLORKEY, SDL_MapRGB(gracz1[0]->format,255,0,255));
	gracz1[1] = wczytajObraz("images/gracz1_dol.png");
	SDL_SetColorKey( gracz1[1], SDL_SRCCOLORKEY, SDL_MapRGB(gracz1[1]->format,255,0,255));
	gracz1[2] = wczytajObraz("images/gracz1_lewo.png");
	SDL_SetColorKey( gracz1[2], SDL_SRCCOLORKEY, SDL_MapRGB(gracz1[2]->format,255,0,255));
	gracz1[3] = wczytajObraz("images/gracz1_prawo.png");
	SDL_SetColorKey( gracz1[3], SDL_SRCCOLORKEY, SDL_MapRGB(gracz1[3]->format,255,0,255));
	//tekstura gracza drugiego:
	gracz2[0] = wczytajObraz("images/gracz2_gora.png");
	SDL_SetColorKey( gracz2[0], SDL_SRCCOLORKEY, SDL_MapRGB(gracz2[0]->format,255,0,255));
	gracz2[1] = wczytajObraz("images/gracz2_dol.png");
	SDL_SetColorKey( gracz2[1], SDL_SRCCOLORKEY, SDL_MapRGB(gracz2[1]->format,255,0,255));
	gracz2[2] = wczytajObraz("images/gracz2_lewo.png");
	SDL_SetColorKey( gracz2[2], SDL_SRCCOLORKEY, SDL_MapRGB(gracz2[2]->format,255,0,255));
	gracz2[3] = wczytajObraz("images/gracz2_prawo.png");
	SDL_SetColorKey( gracz2[3], SDL_SRCCOLORKEY, SDL_MapRGB(gracz2[3]->format,255,0,255));
	//Wczytywanie muzyki:
	muzyka = Mix_LoadMUS("muzyka.wav");
	dzwiekWygrana = Mix_LoadMUS( "win.wav" );
	dzwiekPrzegrana = Mix_LoadMUS( "lose.wav" );
	Mix_PlayMusic( muzyka, -1 );
	return true;
}

void SilnikGraficzny::rysujLabirynt(Labirynt * labirynt)
{
	for(int x=0;x<labirynt->wymiarX;x++)
	{
		for(int y=0;y<labirynt->wymiarY;y++)
		{

			this->nalozObraz(32*x,32*y,obrazLabiryntu[labirynt->getPole(x,y)],screen);
		}
	}

	this->nalozObraz(32*labirynt->gracz1x,32*labirynt->gracz1y,gracz1[labirynt->gracz1kierunek],screen);
	this->nalozObraz(32*labirynt->gracz2x,32*labirynt->gracz2y,gracz2[labirynt->gracz2kierunek],screen);
	this->wyswietlNapis(200,200,komunikat);
	SDL_Flip(screen);
}

bool SilnikGraficzny::obsluzKlawiature(Labirynt * labirynt)
{
	SDL_Event event;
	if(SDL_PollEvent(&event))
	{
		if(event.type == SDL_QUIT)
		{
			return true;
		}
		if( event.type == SDL_KEYDOWN )
		{
			int newposx = labirynt->gracz1x;
			int newposy = labirynt->gracz1y;
				switch( event.key.keysym.sym )
				{
				case SDLK_q:
					return true;
					break;
				case SDLK_UP:
					labirynt->gracz1kierunek=0;
					newposy--;
					break;
				case SDLK_DOWN:
					labirynt->gracz1kierunek=1;
					newposy++;
					break;
				case SDLK_LEFT:
					labirynt->gracz1kierunek=2;
					newposx--;
					break;
				case SDLK_RIGHT:
					labirynt->gracz1kierunek=3;
					newposx++;
					break;
				case SDLK_o:
					while(!labirynt->sciezkaGracza2.empty())
					labirynt->sciezkaGracza2.pop();
					break;

				default:
					break;
				}
			if(newposx>=0 && newposx<labirynt->wymiarX &&
				newposy>=0 && newposy<labirynt->wymiarY &&
					labirynt->getPole(newposx,newposy) !=Labirynt::PRZESZKODA )
			{
				labirynt->gracz1x=newposx;
				labirynt->gracz1y=newposy;
			}

			}
	}
	return false;
}

SilnikGraficzny::~SilnikGraficzny()
{
	SDL_Quit();
}
